// 当程序一直在等待从信道里读取数据，而此时并没有人会往信道中写入数据。此时程序就会陷入死循环，造成死锁。
package main

import (
	"fmt"
	"sync"
	"time"
)

var wqg sync.WaitGroup

func main() {
	pipline := make(chan int)
	wqg.Add(2)
	go func() {
		defer wqg.Done()
		for i := 0; i < 10; i++ {
			time.Sleep(time.Second)
			pipline <- i
		}
		close(pipline) // 关闭chan,循环chan的协程就可以退出循环了，否则因为chan的sendq为空陷入deadlock
		//解决方法很简单，只要在发送完数据后，手动关闭信道，告诉 range 信道已经关闭，无需等待就行。
	}()

	go func() {
		defer wqg.Done()
		for v := range pipline {
			fmt.Println("v:", v)
		}
	}()
	wqg.Wait()
}
